package com.spring.demo.webflux.demo.test;

import org.reactivestreams.Subscription;
import reactor.core.publisher.BaseSubscriber;

/**
 *  自定义订阅器
 *  主要作用实现一个可控的消费速度
 * @author wangzhilong
 * @date 2021/3/15
 */
public class SampleSubscriber<T> extends BaseSubscriber<T> {

    /**
     * 必要方法
     * @param subscription
     */
    @Override
    protected void hookOnSubscribe(Subscription subscription) {
        System.out.println("subscribed");
        //订阅成功后向publisher发送一个请求信号，请求一个数据，其实目的就是为了自定义"背压"。
        //request(n) 就是这样一个方法。它能够在任何 hook 中，通过 subscription 向上游传递 背压请求。
        // 这里我们在开始这个流的时候请求1个元素值。
        subscription.request(1);
    }

    /**
     * 必要方法
     * @param value
     */
    @Override
    protected void hookOnNext(T value) {
        System.out.println("hookOnNext --->" + value);
        //随着接收到新的值，我们继续以每次请求一个元素的节奏从源头请求值。
        request(1);
    }

    @Override
    protected void hookOnComplete() {
        System.out.println("hookOnComplete");
//        request(1);
    }
}

